package com.codeman.javaSe;

public class collectionSizeAnalyze {
    static final int MAXIMUM_CAPACITY = 1 << 30;
    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.toBinaryString(2147483647));
    }

    static final int tableSizeFor(int cap) {
        int n = cap - 1; // 减1可以保证cap=1的情况，返回的是1而不是2
                         // 如果是2^n+1的情况，长度会刚好，2^n+1，而不是2^(n+1),多了2倍的容量
        n |= n >>> 1;    // 无符号右移x位，右移仅是1右移，因此做了|运算会使原来的1保留，并且1右边x位的数字必为1
        n |= n >>> 2;    // 1-2-4-8-16, 按理说应该到-32的，但其实16就会覆盖到全部
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }
}
